﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;

namespace LM.Servicos
{
    class ServicoDeDepenente : IServicoDeDepentente
    {
        public void Cadastre(DtoDependente dependente)
        {
            var repositorioDeDependente = FabricaDeRepositorios.Crie<IRepositorioDeDependente>();
            var validadorDeDependente = new ValidadorDeDependente(repositorioDeDependente);
            var dependenteObjeto = ConversorDeObjetos.Copie<Dependente>(dependente);

            validadorDeDependente.ValideCadastro(dependenteObjeto);

            repositorioDeDependente.Cadastre(dependenteObjeto);
        }

        public DtoDependente Valide(DtoDependente dependente)
        {
            var repositorioDeDependente = FabricaDeRepositorios.Crie<IRepositorioDeDependente>();
            var validadorDeDependente = new ValidadorDeDependente(repositorioDeDependente);
            var dependenteObjeto = ConversorDeObjetos.Copie<Dependente>(dependente);

            validadorDeDependente.ValideCadastro(dependenteObjeto);

            return dependente;
        }

        public void Atualize(DtoDependente dependente)
        {
            var repositorioDeDependente = FabricaDeRepositorios.Crie<IRepositorioDeDependente>();
            var validadorDependente = new ValidadorDeDependente(repositorioDeDependente);
            var dependenteObjeto = ConversorDeObjetos.Copie<Dependente>(dependente);

            validadorDependente.ValideAtualizacao(dependenteObjeto);

            repositorioDeDependente.Atualize(dependenteObjeto);
        }

        public void Exclua(int codigo)
        {
            var repositorioDeDependente = FabricaDeRepositorios.Crie<IRepositorioDeDependente>();
            var validadorDeDependente = new ValidadorDeDependente(repositorioDeDependente);
            var dependenteObjeto = ConversorDeObjetos.Copie<Dependente>(repositorioDeDependente.Consulte(codigo));

            validadorDeDependente.ValideExclusao(dependenteObjeto);

            repositorioDeDependente.Exclua(dependenteObjeto);
        }

        public DtoDependente Consulte(int codigo)
        {
            var dependenteObjeto = FabricaDeRepositorios.Crie<IRepositorioDeDependente>().Consulte(codigo);

            return ConversorDeObjetos.Copie<DtoDependente>(dependenteObjeto);
        }

        public IList<DtoDependente> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoDependente, Dependente>(FabricaDeRepositorios.Crie<IRepositorioDeDependente>().ConsulteTodos());
        }
    }
}
